package com.kdzy.lshy.socity_server.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kdzy.lshy.socity_server.common.*;
import com.kdzy.lshy.socity_server.repository.BaseDao;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * 我的消息service
 * @author cly
 * @since 2018-06-21
 */
@Service(value = "dwellerMessageService")
public class DwellerMessageService extends BaseService {

    private static final Logger logger = LoggerFactory.getLogger(DwellerMessageService.class);

    @Resource
    private BaseDao baseDao;

    /**
     * 居民我的消息 -- 列表查询
     * @param param 包含消息内容
     * @return 结果集
     */
    public Object getAllByCondition(String param, HttpServletRequest request) {

        LinkedHashMap<Object, Object> map = null;
        try {
            if (StringUtils.isNoneBlank(StringUtils.trim(param))){
                // 获取参数
                JSONObject jsonObject = JSON.parseObject(param);
                Long stamp = jsonObject.getLong("stamp"); // 时间戳
                String dwellerId = (String)jsonObject.get("dweller_id"); // 居民唯一标识
                Integer type = jsonObject.getInteger("type"); // 消息类型 0:短信 1:微信 2:站内
                Integer readType = jsonObject.getInteger("read_type"); // 阅读状态 0:未读 1:已读
                Integer version = jsonObject.getInteger("version"); // 数据版本 0:测试 1:生产
                Integer isUsed = jsonObject.getInteger("is_used"); // 是否有效 0:有效 1:无效
                Integer visitPlat = jsonObject.getInteger("visit_plat"); // 访问平台 0网页 1一体机 2小程序 3其他
                Integer visitType = jsonObject.getInteger("visit_type"); // 访问类型 0:测试 1:生产

                // 参数非空判断
                if (stamp == null) {
                    logger.info("参数stamp为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (version == null) {
                    logger.info("参数version为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (isUsed == null) {
                    logger.info("参数is_used为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (visitPlat == null) {
                    logger.info("参数visit_plat为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }
                if (visitType == null) {
                    logger.info("参数visit_type为空");
                    map = ResultMap.creatReault("88", "失败", "参数为空");
                    logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }

                String dwellerIdcard = null;
                if (visitPlat == 0) { // 网页端
                    String systoken = (String)jsonObject.get("systoken"); // 全局token
                    if (StringUtils.isBlank(systoken)) {
                        logger.info("systoken为空");
                        map = ResultMap.creatReault("33", "失败", "token为空");
                        logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                    // 根据身份证从redis中获取token
                    Jedis jedis = new Jedis("140.143.210.101", 6379);
                    jedis.auth("q1w2e3r4t5");

                    List<String> infoList = jedis.hmget(systoken, "systoken",  "dwellerIdcard", "dwellerId");
                    String systokenRedis = null;
                    if (infoList != null && infoList.size() > 0) {
                        systokenRedis = infoList.get(0); // token
                        dwellerIdcard = infoList.get(1); // 居民身份证号
                        dwellerId = infoList.get(2); // 居民唯一标识
                    }

                    // 查看token是否过期
                    if (StringUtils.isBlank(systokenRedis)) { // 重新登录，弹出登录框
                        logger.info("全局systoken过期，需要重新获取systoken");
                        map = ResultMap.creatReault("33", "失败", "systoken过期");
                        logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }

                    // token不一致
                    if (!StringUtils.equals(systokenRedis, systoken)) {
                        logger.info("用户访问的token不一致");
                        map = ResultMap.creatReault("331", "失败", "systoken不一致");
                        logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                        return map;
                    }
                    jedis.close();
                }

                String content = (String)jsonObject.get("content"); // 消息内容

                // 动态参数集合
                List<Object> tags = new ArrayList<Object>();

                // 基础sql
                StringBuilder sql = new StringBuilder("SELECT\n" +
                        "\tmsg.ID,\n" +
                        "\tmsg.content,\n" +
                        "\tdwm.type,\n" +
                        "\tdwm.read_type,\n" +
                        "\tdep.dep_name,\n" +
                        "\tbz.bizz_name,\n" +
                        "\toff.officer_name\n" +
                        "FROM\n" +
                        "\tdweller dw,\n" +
                        "\tdweller_message dwm,\n" +
                        "\tmessage msg,\n" +
                        "\tdepartments dep,\n" +
                        "\tbizz bz,\n" +
                        "\tofficer off\n" +
                        "WHERE\n" +
                        "\tdw.ID = dwm.dweller_id\n" +
                        "AND dwm.message_id = msg.ID\n" +
                        "AND msg.dep_id = dep.ID\n" +
                        "AND msg.bizz_id = bz.ID\n" +
                        "AND msg.officer_id = off.ID");

                if (StringUtils.isNoneBlank(StringUtils.trim(dwellerId))){
                    sql.append(" AND msg.dweller_id = ?");
                    tags.add(dwellerId);
                }
                if (readType != null){
                    sql.append(" AND dwm.read_type = ?");
                    tags.add(readType);
                }
                if (type != null){
                    sql.append(" AND dwm.type = ?");
                    tags.add(type);
                    sql.append(" AND msg.TYPE = ?");
                    tags.add(type);
                }
                if (version != null){
                    sql.append(" AND dw.version = ?");
                    tags.add(version);
                    sql.append(" AND dwm.version = ?");
                    tags.add(version);
                    sql.append(" AND msg.version = ?");
                    tags.add(version);
                    sql.append(" AND dep.version = ?");
                    tags.add(version);
                    sql.append(" AND bz.version = ?");
                    tags.add(version);
                    sql.append(" AND off.version = ?");
                    tags.add(version);
                }
                if (visitType != null){
                    sql.append(" AND dw.visit_type = ?");
                    tags.add(visitType);
                    sql.append(" AND dwm.visit_type = ?");
                    tags.add(visitType);
                    sql.append(" AND msg.visit_type = ?");
                    tags.add(visitType);
                    sql.append(" AND dep.visit_type = ?");
                    tags.add(visitType);
                    sql.append(" AND bz.visit_type = ?");
                    tags.add(visitType);
                    sql.append(" AND off.visit_type = ?");
                    tags.add(visitType);
                }
                if (isUsed != null){
                    sql.append(" AND dw.is_used = ?");
                    tags.add(isUsed);
                    sql.append(" AND dwm.is_used = ?");
                    tags.add(isUsed);
                    sql.append(" AND msg.is_used = ?");
                    tags.add(isUsed);
                    sql.append(" AND dep.is_used = ?");
                    tags.add(isUsed);
                    sql.append(" AND bz.is_used = ?");
                    tags.add(isUsed);
                    sql.append(" AND off.is_used = ?");
                    tags.add(isUsed);
                }
                if (StringUtils.isNoneBlank(StringUtils.trim(content))){
                    sql.append(" AND msg.content like ?");
                    tags.add("%" + content + "%");
                }

                // 处理分页信息
                Pagenation page = new Pagenation();

                // 统计总数sql
                StringBuilder sqlCount = new StringBuilder("SELECT count(*) as count FROM (" + sql + ") as res");

                // 获取总数
                long count = (Long) baseDao.queryForList(sqlCount.toString(), tags.toArray()).get(0).get("count");
                if (count == 0) {
                    logger.info("暂无结果");
                    map = ResultMap.creatReault("1", "成功", "结果集为空");
                    logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
                    return map;
                }

                // 设置总数
                page.setTotal((int)count);

                Integer pageNo = (Integer) request.getAttribute("page"); // 当前页（或者是索引）
                Integer rows = (Integer) request.getAttribute("rows"); // 每页显示多少条

                if (pageNo != null && rows != null) {
                    // 条件sql
                    sql.append(" order by msg.update_time");
                    sql.append(" limit ?, ?");
                }
                logger.info("getAllByCondition sql语句：" + sql.toString());

                tags.add(pageNo);
                tags.add(rows);
                logger.info("getAllByCondition 分页数据：" + tags);

                // 分页查询结果集
                List<Map<String, Object>> pageLIst = baseDao.queryForList(sql.toString(), tags.toArray());

                // 参数置空
                sql = null;
                tags = null;

                map = ResultMap.creatReault("0", "成功", null);
                // bootstrap-table 专属
                map.put("rows", pageLIst); // 结果集
                map.put("total", count); // 总条数
                if (count % rows == 0) {
                    map.put("totalPages", count / rows); // 总页数
                } else {
                    map.put("totalPages", (count / rows) + 1); // 总页数
                }
            } else {
                logger.info("参数为空");
                map = ResultMap.creatReault("88", "失败", "参数为空");
            }
        } catch (ClassCastException e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("98", "失败", "参数类型错误");
            logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
            return map;
        } catch (Exception e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("99", "失败", "后台处理异常");
            return map;
        }

        logger.info("出去《居民我的消息 -- 列表查询》list()方法；出参 = " + JSON.toJSONString(map));
        return map;
    }

    /**
     * 居民我的消息 -- 消息删除
     * @param param 消息Id
     * @return 是否成功
     */
    public Object delete(String param, HttpServletRequest request) {

        LinkedHashMap<Object, Object> map = null;
        try {
            if (StringUtils.isNoneBlank(StringUtils.trim(param))){
                // 获取参数
                JSONObject jsonObject = JSON.parseObject(param);
                String ID = (String)jsonObject.get("ID"); // 消息唯一标识
                Long stamp = jsonObject.getLong("stamp"); // 时间戳
                Integer isUsed = jsonObject.getInteger("is_used"); // 是否失效 0:有效 1:无效
                Integer version = jsonObject.getInteger("version"); // 数据版本 0:测试 1:生产
                Integer visitPlat = jsonObject.getInteger("visit_plat"); // 访问平台 0网页 1一体机 2小程序 3其他
                Integer visitType = jsonObject.getInteger("visit_type"); // 访问类型 0测试 1生产

                // 参数非空判断
                if (stamp == null) {
                    logger.info("参数stamp为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }
                if (version == null) {
                    logger.info("参数version为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }
                if (isUsed == null) {
                    logger.info("参数is_used为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }
                if (visitPlat == null) {
                    logger.info("参数visit_plat为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }
                if (visitType == null) {
                    logger.info("参数visit_type为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }

                String updateTime = DateUtil.format(new Date(stamp), "yyyy-MM-dd HH:mm:dd"); // 更新时间yyyy-MM-dd HH:mm:ss

                String dwellerId = null;
                String dwellerIdcard = null;
                if (visitPlat == 0) { // 网页端 - 根据systoken换取居民id
                    String systoken = (String)jsonObject.get("systoken"); // 全局token
                    if (StringUtils.isBlank(systoken)) {
                        logger.info("systoken为空");
                        return ResultMap.creatReault("33", "失败", "token为空");
                    }

                    // 根据身份证从redis中获取token
                    Jedis jedis = new Jedis("140.143.210.101", 6379);
                    jedis.auth("q1w2e3r4t5");

                    List<String> infoList = jedis.hmget(systoken, "systoken",  "dwellerIdcard", "dwellerId");
                    String systokenRedis = null;
                    if (infoList != null && infoList.size() > 0) {
                        systokenRedis = infoList.get(0); // token
                        dwellerIdcard = infoList.get(1); // 居民身份证号
                        dwellerId = infoList.get(2); // 居民唯一标识
                    }

                    // 查看token是否过期
                    if (StringUtils.isBlank(systokenRedis)) { // 重新登录，弹出登录框
                        logger.info("全局systoken过期，需要重新获取systoken");
                        return ResultMap.creatReault("33", "失败", "systoken过期");
                    }

                    // token不一致
                    if (!StringUtils.equals(systokenRedis, systoken)) {
                        logger.info("用户访问的token不一致");
                        return ResultMap.creatReault("331", "失败", "systoken不一致");
                    }
                    jedis.close();
                }

                // 动态参数集合
                List<Object> tags = new ArrayList<Object>();
                tags.add(updateTime);
                tags.add(stamp);
                tags.add(isUsed);
                tags.add(version);
                tags.add(visitPlat);
                tags.add(visitType);
                tags.add(ID);
                logger.info("delete 动态参数：" + tags);

                // 编写sql
                StringBuilder sql = new StringBuilder("update message set update_time = ?, stamp = ?, is_used = ?, version = ?, visit_plat = ?, visit_type = ? where ID = ?");
                logger.info("delete sql语句：" + sql.toString());

                // 调用dao更新
                int row = baseDao.update(sql.toString(), tags.toArray());

                if(row <= 0) {
                    logger.info("更新失败");
                    map = ResultMap.creatReault("77", "失败", "数据库操作失败");
                    return map;
                }

                // 参数置空
                sql = null;
                tags = null;

                map = ResultMap.creatReault("0", "成功", "数据更新成功");
            } else {
                logger.info("参数为空");
                map = ResultMap.creatReault("88", "失败", "参数为空");
            }
        } catch (ClassCastException e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            return ResultMap.creatReault("98", "失败", "参数类型错误");
        } catch (Exception e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("99", "失败", "后台处理异常");
        }

        logger.info("出去《居民我的消息 -- 消息删除》list()方法；出参 = " + JSON.toJSONString(map));
        return map;
    }

    public Object update(String param, HttpServletRequest request) {
        LinkedHashMap<Object, Object> map = null;
        try {
            if (StringUtils.isNoneBlank(StringUtils.trim(param))){
                // 获取参数
                JSONObject jsonObject = JSON.parseObject(param);
                String ID = (String)jsonObject.get("ID"); // 消息唯一标识
                String content = (String)jsonObject.get("content"); // 更新内容
                Long stamp = jsonObject.getLong("stamp"); // 时间戳
                Integer isUsed = jsonObject.getInteger("is_used"); // 是否失效 0:有效 1:无效
                Integer version = jsonObject.getInteger("version"); // 数据版本 0:测试 1:生产
                Integer visitPlat = jsonObject.getInteger("visit_plat"); // 访问平台 0网页 1一体机 2小程序 3其他
                Integer visitType = jsonObject.getInteger("visit_type"); // 访问类型 0测试 1生产

                // 参数非空判断
                if (stamp == null) {
                    logger.info("参数stamp为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }
                if (version == null) {
                    logger.info("参数version为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }
                if (isUsed == null) {
                    logger.info("参数is_used为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }
                if (visitPlat == null) {
                    logger.info("参数visit_plat为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }
                if (visitType == null) {
                    logger.info("参数visit_type为空");
                    return ResultMap.creatReault("88", "失败", "参数为空");
                }

                String updateTime = DateUtil.format(new Date(stamp), "yyyy-MM-dd HH:mm:dd"); // 更新时间yyyy-MM-dd HH:mm:ss

                String dwellerId = null;
                String dwellerIdcard = null;
                if (visitPlat == 0) { // 网页端
                    String systoken = (String)jsonObject.get("systoken"); // 全局token
                    if (StringUtils.isBlank(systoken)) {
                        logger.info("systoken为空");
                        return ResultMap.creatReault("33", "失败", "token为空");
                    }

                    // 根据身份证从redis中获取token
                    Jedis jedis = new Jedis("140.143.210.101", 6379);
                    jedis.auth("q1w2e3r4t5");

                    List<String> infoList = jedis.hmget(systoken, "systoken",  "dwellerIdcard", "dwellerId");
                    String systokenRedis = null;
                    if (infoList != null && infoList.size() > 0) {
                        systokenRedis = infoList.get(0); // token
                        dwellerIdcard = infoList.get(1); // 居民身份证号
                        dwellerId = infoList.get(2); // 居民唯一标识
                    }

                    // 查看token是否过期
                    if (StringUtils.isBlank(systokenRedis)) { // 重新登录，弹出登录框
                        logger.info("全局systoken过期，需要重新获取systoken");
                        return ResultMap.creatReault("33", "失败", "systoken过期");
                    }

                    // token不一致
                    if (!StringUtils.equals(systokenRedis, systoken)) {
                        logger.info("用户访问的token不一致");
                        return ResultMap.creatReault("331", "失败", "systoken不一致");
                    }
                    jedis.close();
                }

                // 动态参数集合
                List<Object> tags = new ArrayList<Object>();
                tags.add(content);
                tags.add(updateTime);
                tags.add(isUsed);
                tags.add(version);
                tags.add(visitPlat);
                tags.add(visitType);
                tags.add(stamp);
                tags.add(ID);
                logger.info("update 动态参数：" + tags);

                // 编写sql
                StringBuilder sql = new StringBuilder("update message set content = ?, update_time = ?, is_used = ?, version = ?, visit_plat = ?, visit_type = ?, stamp = ? where ID = ?");
                logger.info("update sql语句：" + sql.toString());

                // 调用dao层更新信息
                int row = baseDao.update(sql.toString(), tags.toArray());
                if(row <= 0) {
                    map = ResultMap.creatReault("77", "失败", "数据库操作失败");
                    return map;
                }

                // 参数置空
                sql = null;
                tags = null;

                map = ResultMap.creatReault("0", "成功", "数据更新成功");
            } else {
                logger.info("参数为空");
                map = ResultMap.creatReault("88", "失败", "参数为空");
            }
        } catch (ClassCastException e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            return ResultMap.creatReault("98", "失败", "参数类型错误");
        } catch (Exception e) {
            logger.info("后台处理异常，异常信息1：" + ExceptionDetailMessage.getExceptionDetail(e));
            map = ResultMap.creatReault("99", "失败", "后台处理异常");
        }

        logger.info("出去《居民我的消息 -- 消息更新》list()方法；出参 = " + JSON.toJSONString(map));
        return map;
    }
}
